
// void Fun(int &x){ cout << "左值引用" << endl; }
// void Fun(const int &x){ cout << "const 左值引用" << endl; }
// void Fun(int &&x){ cout << "右值引用" << endl; }
// void Fun(const int &&x){ cout << "const 右值引用" << endl; }
// // 模板中的&&不代表右值引用，而是万能引用，其既能接收左值又能接收右值。
// // 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力，
// // 但是引用类型的唯一作用就是限制了接收的类型，后续使用中都退化成了左值，
// // 我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用我们下面学习的完美转发
// template<typename T>
// void PerfectForward(T&& t)
// {
//     //std::forward<T>(t)在传参的过程中保持了t的原生类型属性
//     Fun(std::forward<T>(t));
// }
// int main()
// {
//     PerfectForward(10); // 右值
//     int a;
//     PerfectForward(a); // 左值
//     PerfectForward(std::move(a)); // 右值
//     const int b = 8;
//     PerfectForward(b); // const 左值
//     PerfectForward(std::move(b)); // const 右值

//     return 0;
// }


//Built in types and custom types
// void MoveBuiltinTypes()
// {
//     cout<<"----------------"<<endl;

//     std::vector<int> vec;
//     int a = 10;
//     vec.push_back(std::move(a)); // 使用push_back将已有对象a添加到容器中
//     cout<<"a:"<<a<<endl;
// }
// void MoveCustomTypes()
// {
//     cout<<"----------------"<<endl;
//     std::vector<std::string> vec;
//     std::string s = "hello";
//     vec.push_back(s);        // 拷贝构造：复制 s 到容器中
//     vec.push_back(std::move(s)); // 移动构造：转移 s 的资源到容器中
//     cout<<"s:"<<s<<endl;
//     cout<<"s.size():"<<s.size()<<endl;
// }
// int main()
// {
//     MoveBuiltinTypes();
//     MoveCustomTypes();
//     return 0;
// }
#include<iostream>
#include<map>
#include<string>
#include<thread>
#include<vector>

// void test1()
// {
//     int a = 1,b = 0;
//     cout<<"a:"<<a<<" "<<"b:"<<b<<endl;
//     auto myswap = [&a,&b](){int t = a;a = b;b = t;};
//     myswap(a,b);
//     cout<<"a:"<<a<<" "<<"b:"<<b<<endl;
// }
// #include<mutex>
#include<atomic>
using namespace std;

atomic_ulong sum {0};//列表初始化
// std::mutex mtx;
void fun(size_t num)
{
    for (size_t i = 0; i < num; ++i)
    {
        // mtx.lock();
        sum++;
        // mtx.unlock();
    }
}
int main()
{
    cout << "Before joining,sum = " << sum << std::endl;
    thread t1(fun, 10000000);
    thread t2(fun, 10000000);
    t1.join();
    t2.join();
    cout << "After joining,sum = " << sum << std::endl;
    return 0;
}